home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-04 / bipl.zip / PROGS.ZIP / MONKEYS.ICN < prev    next >
Text File  |  1992-09-28  |  2KB  |  72 lines

  1. ############################################################################
  2. #
  3. #    File:     monkeys.icn
  4. #
  5. #    Subject:  Program to generate random text
  6. #
  7. #    Author:   Stephen B. Wampler, modified by Ralph E. Griswold and
  8. #           Alan Beale
  9. #
  10. #    Date:     September 7, 1990
  11. #
  12. ###########################################################################
  13. #
  14. #  The old monkeys at the typewriters anecdote ...
  15. #
  16. #     This program uses ngram analysis to randomly generate text in
  17. #  the same 'style' as the input text.  The arguments are:
  18. #
  19. #     -s     show the input text
  20. #     -n n   use n as the ngram size (default:3)
  21. #     -l n   output at about n lines (default:10)
  22. #     -r n   set random number seed to n
  23. #
  24. ############################################################################
  25. #
  26. #  Links: options
  27. #
  28. ############################################################################
  29.  
  30. link options
  31.  
  32. procedure main(args)
  33.    local switches, n, linecount, ngrams, preline
  34.    local line, ngram, nextchar, firstngram, Show
  35.  
  36.    switches := options(args,"sn+l+r+")
  37.    if \switches["s"] then Show := writes else Show := 1
  38.    n := \switches["n"] | 3
  39.    linecount := \switches["l"] | 10
  40.    &random := \switches["r"]
  41.  
  42.    ngrams := table()
  43.  
  44.    Show("Orginal Text is: \n\n")
  45.  
  46.    preline := ""
  47.    every line := preline || !&input do {
  48.       Show(line)
  49.       line ? {
  50.             while ngram := move(n) & nextchar := move(1) do {
  51.                /firstngram := ngram
  52.                /ngrams[ngram] := ""
  53.                ngrams[ngram] ||:= nextchar
  54.                move(-n)
  55.                }
  56.             preline := tab(0) || "\n"
  57.             }
  58.       }
  59.  
  60.    Show("\n\nGenerating Sentences\n\n")
  61.  
  62.    ngram := writes(firstngram)
  63.    while linecount > 0 do {
  64.       if /ngrams[ngram] then
  65.          exit()                 # if hit EOF ngram early
  66.       ngram := ngram[2:0] || writes(nextchar := ?ngrams[ngram])
  67.       if (nextchar == "\n") then
  68.          linecount -:= 1
  69.       }
  70.  
  71. end
  72.